package com.btt.pattern.proxy.jdk;

import com.btt.pattern.proxy.statics.Person;
import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;

/**
 * created by Btt on 2018/07/03
 */

public class JDKProxyTest {

    public static void main(String[] args) {
        try {
            Person liSi = (Person)new JDKMeiPo().getInstance(new LiSi());
            //System.out.println(liSi);
            liSi.findLove();

            //代理模式原理
            //1、拿到被代理对象的引用，并且获取它的所有的接口，反射获取
            //2、JDK Proxy类重新生成一个新的类、同时新的类药实现被代理类所有实现的所有的接口
            //3、动态生成Java代码，把新加的业务逻辑方法由一定的逻辑代码去调用（在代码中体现）
            //4、编译新生成的Java代码.class
            //5、在重新加载到JVM中运行
            //以上过程就是字节码重组


            //通过反编译工具查看源代码
            byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Person.class});
            FileOutputStream os = new FileOutputStream("D://$Proxy0.class");
            os.write(bytes);
            os.close();





        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
